package br.com.salao.dao;

import java.util.List;

import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import br.com.salao.bean.Login;
import br.com.salao.bean.Usuario;
import br.com.salao.dao.UsuarioDao;
import br.com.salao.util.JpaUtil;


public class UsuarioDaoImpl implements UsuarioDao {

	private final GenericDao<Usuario> dao;

	public UsuarioDaoImpl(EntityManager em){
		dao = new GenericDao<Usuario>(em, Usuario.class);
	}

	public Usuario inserir(Usuario usuario) {
		return dao.salvar(usuario);
	}

	public List<Usuario> listar(){		
		return dao.lista();
	}		

	public Usuario update(Usuario usuario){
		return dao.update(usuario);
	}

	public int getUsuarioCount() {

		EntityManager em =  JpaUtil.getEntityManager();
		em.getTransaction().begin();

		try {
			Query q = em.createQuery("select count(o) from Usuario as o");
			return ((Long) q.getSingleResult()).intValue();
		} finally {
			em.close();
		}
	}

	public Usuario buscarUsuarioPeloCpf(String cpf){		

		EntityManager em =  JpaUtil.getEntityManager();
		Usuario usuario = null;
		try{
			Query query = em.createQuery("from Usuario e where e.cpf like :cpf");
			query.setParameter("cpf", cpf);
			usuario = (Usuario)query.getSingleResult();
		}catch (Exception e) {
			usuario = null;
		}finally{
			if(em != null){
				em.close();
			}
		}
		return usuario; 
	}

	public Usuario buscarUsuarioPeloEmail(String email){		

		EntityManager em =  JpaUtil.getEntityManager();
		Usuario usuario = null;
		try{
			Query query = em.createQuery("from Usuario e where e.email like :email");
			query.setParameter("email", email);
			usuario = (Usuario)query.getSingleResult();
		}catch (Exception e) {
			usuario = null;
		}finally{
			if(em != null){
				em.close();
			}
		}
		return usuario; 
	}

	public Login guardaLoginSessao(String login){		

		EntityManager em =  JpaUtil.getEntityManager();
		Login objLogin ;

		try{
			Query query = em.createQuery("from Login l where l.login like :login");
			query.setParameter("login", login);
			objLogin = (Login)query.getSingleResult();

			FacesContext facesContext = FacesContext.getCurrentInstance();
			@SuppressWarnings("static-access")
			HttpServletRequest request = (HttpServletRequest) facesContext.getCurrentInstance().getExternalContext().getRequest();
			HttpSession session = request.getSession();
			session.setAttribute("loginUsuarioLogado", objLogin); 				

		}catch (Exception e) {
			return null;

		}finally{
			if(em != null){
				em.close();
			}
		}
		return objLogin; 
	}

	public Usuario guardaUsuarioSessao(String login){

		EntityManager em =  JpaUtil.getEntityManager();
		Login objLogin ;
		Usuario objUsuario;
		try{
			Query query = em.createQuery("from Login l where l.login like :login");
			query.setParameter("login", login);
			objLogin = (Login)query.getSingleResult();

			Query query2 = em.createQuery("from Usuario u where u.id like :idLogin");
			query2.setParameter("idLogin", objLogin.getId());
			objUsuario = (Usuario) query2.getSingleResult();

			FacesContext facesContext = FacesContext.getCurrentInstance();
			@SuppressWarnings("static-access")
			HttpServletRequest request = (HttpServletRequest) facesContext.getCurrentInstance().getExternalContext().getRequest();
			HttpSession session = request.getSession();
			session.setAttribute("usuarioLogado", objUsuario);

		}catch (Exception e) {
			return null;
		}finally{
			if(em != null){
				em.close();
			}
		}
		return objUsuario;
	}
}
